1 REM 1541 DISK DRIVE CLEANING UTILITY 2 REM AUTHOR - JOHN DEROSA & THE AHOY! STAFF 3 PRINT"[147]":POKE53280,11:POKE53281,11 4 PRINT"[158]THE 1541 DISK CLEANING UTILITY[156]" 5 PRINT"[156][213][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][201]" 6 PRINT"[194] 1541 [194]" 7 PRINT"[194] [176][192][192][192][192][184][184][184][184][184][184][192][192][192][192][192][174] [194]" 8 PRINT"[194] [171][192][192][192][192][162][162][162][162][162][162][192][192][192][192][192][179] [194]" 9 PRINT"[194] [194][210] [194] [194]" 10 PRINT"[194][209][173][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][189] [194]" 11 PRINT"[202][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][192][203]" 12 PRINT"[158] BY JOHN DEROSA" 13 PRINT" FOR AHOY! MAGAZINE[156]" 19 FORZ=1TO6000:NEXT 20 D$=" ":AA=0 30 PRINT "[147] ENTER CURRENT DATE? "; 40 GET A$:IF A$="" THEN 40 50 IF A$=CHR$(13) THEN 100 60 PRINT A$;:D$=D$+A$:GOTO 40 100 REM INITIALIZE SCREEN 110 GOSUB 1200 120 PRINT "DO YOU WANT TO READ DATA FROM DISK?(Y/N)" 130 GOSUB 2500 140 GOSUB 1200 150 IF AN$="N" THEN 340 200 REM READ DATA FROM DISK DRIVE 210 PRINT " INSERT DATA DISK" 220 PRINT " PRESS ANY KEY TO READ DATA" 230 GET AN$:IF AN$="" THEN 230 240 OPEN15,8,15:OPEN2,8,2,"CLEANDATA,S,R" 250 GOSUB 1300 260 IF A <> 0 THEN 300 270 INPUT#2,DT$,TR,SC,NC,NM 280 GOSUB 1300 290 IF A = 0 THEN 390 300 PRINT " DATA NOT READ FROM DISK" 310 PRINT " TRY AGAIN ? (Y/N)" 320 GOSUB 2500 330 IF AN$="Y" THEN CLOSE 2:GOSUB 1200:GOTO 200 340 GOSUB 1200:DT$=D$:TR=2:SC=30:NC=0:NM=15 350 PRINT " DATA NOT READ FROM DISK" 360 PRINT " DEFAULT VALUES USED" 370 PRINT " PRESS ANY KEY TO CONTINUE" 380 GET AN$:IF AN$="" THEN 380 390 CLOSE 2:CLOSE 15 400 REM DISPLAY AUTO DATA 410 PRINT "[147]" 420 PRINT " CURRENT DATE IS ";D$;"[146]" 430 PRINT " LAST DATE CLEANED IS: ";DT$ 440 PRINT " CURRENT TRACK IS: ";TR 450 PRINT " CURRENT CLEANING TIME IS (SEC): ";SC 460 PRINT " NUMBER OF TIMES DISK USED IS: ";NC 470 PRINT " MAXIMUM CLEANINGS PER DISK IS: ";NM 480 PRINT " NUMBER OF CLEANINGS LEFT IS: ";NM-NC;"[146]" 490 PRINT " DO YOU WANT TO CHANGE DATA? (Y/N)" 495 GOSUB 2500:IF AN$="N" THEN 800 500 REM CHANGE AUTO DATA 510 PRINT "[147]" 520 PRINT " LAST DATE CLEANED IS ";DT$ 530 PRINT " ENTER NEW DATE";:INPUT DT$ 540 PRINT " CURRENT TRACK IS ";TR 550 PRINT " ENTER NEW TRACK (1-35)";:INPUT TR 560 IF TR<1 THEN PRINT "[145][145][145][145]":GOTO 540 570 IF TR>35 THEN PRINT "[145][145][145][145]":GOTO 540 590 PRINT " CURRENT CLEANING TIME IS ";SC 600 PRINT " ENTER NEW TIME (< 300)";:INPUT SC 610 IF SC>300 THEN PRINT "[145][145][145][145]":GOTO 590 620 IF SC<1 THEN PRINT "[145][145][145][145]":GOTO 590 630 PRINT " NUMBER OF TIMES DISK USED IS ";NC 640 PRINT " ENTER NEW NUMBER ";:INPUT NC 650 PRINT " MAXIMUM CLEANINGS PER DISK IS";NM 660 PRINT " ENTER NEW MAXIMUM ";:INPUT NM 670 PRINT " DO YOU WANT TO CHANGE DATA? (Y/N)" 680 GOSUB 2500 690 IF AN$="Y" THEN 500 700 PRINT " SAVE THIS DATA ON DISK (Y/N)" 710 GOSUB 2500 720 IF AN$="Y" THEN GOSUB 1400 800 REM AUTO CLEANING 805 GOSUB 1200:GOSUB 1000 810 NL=NM-NC 815 IF NL>O THEN 870 820 PRINT " *****WARNING*****" 825 PRINT " CLEANING DISK IS USED UP" 830 PRINT " (";NL;" CLEANINGS LEFT ON DISK)" 835 PRINT " DO YOU WANT TO CONTINUE CLEANING? (Y/N)" 840 GOSUB 2500 845 IF AN$="Y" THEN GOSUB 1200:GOSUB 1000:GOTO 870 850 PRINT " DO YOU WANT TO CHANGE DATA? (Y/N)" 855 GOSUB 2500 860 IF AN$="Y" THEN 500 865 GOTO 955 870 GOSUB 2200:GOSUB 1200:GOSUB 1000 875 PRINT " INSERT CLEANING DISK IN DRIVE" 880 PRINT " PRESS ANY KEY TO START CLEANING" 885 GET AN$:IF AN$="" THEN 885 890 GOSUB 1200:GOSUB 1000 895 PRINT " CLEANING[146]" 900 PRINT " PRESS ANY KEY TO MANUALLY STOP" 905 IF ET>SC THEN 920 910 GOSUB 1700 915 GET AN$:IF AN$="" THEN 905 920 GOSUB 2000:GOSUB 1200:GOSUB 1000 925 PRINT " UPDATE DATA DISK? (Y/N)" 930 GOSUB 2500 935 IF AN$="N" THEN 955 940 NC=NC+1:TR=TR+2:DT$=D$ 945 IF TR>35 THEN TR=1 950 GOSUB 1400 955 PRINT "[147] PROGRAM ENDED":END 1000 REM SUBROUTINE-UPDATE STATUS LINE 1010 IF MF=1 THEN 1040 1020 POKE 1266,143:POKE 1267,134:POKE 1268,134 1030 GOTO 1050 1040 POKE 1266,143:POKE 1267,142:POKE 1268,32 1050 T=TR/10:IF T<1 THEN T2=-144:T1=TR:GOTO 1070 1060 T1=INT(T):T2=TR-10*T1 1070 POKE 1277,T1+176:POKE 1278,T2+176 1075 S=SC/100:IF S<1 THEN S0=0:GOTO 1077 1076 S0=INT(S) 1077 SA=SC-S0*100 1080 S=SA/10:IF S<1 THEN S2=SA:S1=0:GOTO 1100 1090 S1=INT(S):S2=SA-10*S1 1100 POKE 1287,S0+176:POKE 1288,S1+176:POKE 1289,S2+176 1105 E=ET/100:IF E<1 THEN E0=0:GOTO 1107 1106 E0=INT(E) 1107 EA=ET-E0*100 1110 E=EA/10:IF E<1 THEN E2=EA:E1=0:GOTO 1130 1120 E1=INT(E):E2=EA-10*E1 1130 POKE 1298,E0+176:POKE 1299,E1+176:POKE 1300,E2+176 1140 RETURN 1200 REM SUBROUTINE-SET UP SCREEN 1210 PRINT "[147]"SPC(4)"1541 DISK DRIVE CLEANING UTILITY" 1220 PRINT " DRIVE HEAD AT TOTAL ELAPSED" 1230 PRINT " MOTOR TRACK SECONDS SECONDS" 1240 PRINT "[195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195][195]" 1250 RETURN 1300 REM SUBROUTINE-READ ERROR CHANNEL 1310 INPUT#15,A,B$,C,D 1320 IF A=0 THEN RETURN 1340 GOSUB 1200:GOSUB 1000 1350 PRINT " DISK ERROR * ";B$ 1360 CLOSE 15 1370 RETURN 1400 REM SUBROUTINE-SAVE AUTO DATA 1410 GOSUB 1200:GOSUB 1000 1420 PRINT " INSERT DATA DISK" 1430 PRINT " PRESS ANY KEY TO SAVE AUTO DATA " 1440 GET AN$:IF AN$="" THEN 1440 1450 OPEN 15,8,15:OPEN2,8,2,"@0:CLEANDATA,S,W" 1460 GOSUB 1300:IF A <> 0 THEN 1500 1470 PRINT#2,DT$;",";TR;",";SC;",";NC;",";NM 1480 GOSUB 1300:IF A <> 0 THEN 1500 1490 CLOSE2:CLOSE15:RETURN 1500 PRINT " DATA NOT SAVED!" 1520 PRINT " TRY AGAIN? (Y/N)" 1530 GOSUB 2500:CLOSE 2:CLOSE 15 1540 IF AN$="N" THEN RETURN 1550 GOTO 1400 1700 REM SUBROUTINE-MOTOR ON 1710 IF MF=1 THEN 1730 1720 Z=54272:TT=TI:FOR L=Z TO Z+24:POKE L,0:NEXT L 1730 POKE Z+5,9:POKE Z+6,0:POKEZ+24,15:POKE Z+4,33 1740 ET=INT((TI-TT)/60) 1750 IF SW=1 THEN 1770 1760 POKE Z+1,25:POKE Z,170:SW=1:GOTO 1780 1770 POKE Z+1,20:POKE Z,150:SW=0 1780 GOSUB 1000:POKE Z+4,32 1790 IF MF=1 THEN RETURN 1800 OPEN15,8,15 1810 PRINT#15,"M-R"CHR$(0)CHR$(28) 1820 GET#15,X$:X=ASC(X$+CHR$(0)) 1830 BI=XOR4 1840 PRINT#15,"M-W"CHR$(0)CHR$(28)CHR$(1)CHR$(BI) 1850 MF=1:CLOSE 15 1860 RETURN 2000 REM SUBROUTINE-MOTOR OFF 2010 Z=54272:FOR L=Z TO Z+24:POKE L,0:NEXT L 2020 OPEN15,8,15 2030 BI=X 2040 PRINT#15,"M-W"CHR$(0)CHR$(28)CHR$(1)CHR$(BI) 2050 MF=0:CLOSE 15 2060 RETURN 2200 REM SUBROUTINE-MOVE HEAD TO TRACK 2220 PRINT " INSERT ANY FORMATTED DISK" 2230 PRINT " PRESS ANY KEY TO MOVE HEAD" 2240 GET AN$:IF AN$="" THEN 2240 2250 OPEN 15,8,15:OPEN 2,8,2,"#" 2260 PRINT#15,"U1 2 0";TR;"0" 2270 GOSUB 1300 2280 IF A=0 THEN CLOSE 2:CLOSE 15:RETURN 2290 PRINT " MOVE HEAD FAILED" 2300 PRINT " HEAD NOT ON PROPER TRACK" 2400 PRINT " TRY AGAIN? (Y/N)" 2410 GOSUB 2500:CLOSE 2:CLOSE 15 2420 IF AN$="Y" THEN GOSUB 1200:GOSUB 1000:GOTO 2220 2430 RETURN 2500 REM SUBROUTINE - GET (Y/N) ANSWER 2510 GET AN$:IF AN$="" THEN 2510 2520 IF AN$="Y" THEN RETURN 2530 IF AN$="N" THEN RETURN 2540 GOTO 2510